﻿using System;
using System.Security.Cryptography;
using System.Text;

namespace CommonUtils
{
    public class EncryptTools
    {
        #region MD5
        ///   <summary>
        ///   给一个字符串进行MD5加密
        ///   </summary>
        ///   <param   name="strText">待加密字符串</param>
        ///   <returns>加密后的字符串</returns>
        public static string MD5Encrypt(string str)
        {
            if (string.IsNullOrEmpty(str))
            {
                return "";
            }
            string cl = str;
            string pwd = "";
            MD5 md5 = MD5.Create();//实例化一个md5对像
            // 加密后是一个字节类型的数组，这里要注意编码UTF8/Unicode等的选择　
            byte[] s = md5.ComputeHash(Encoding.UTF8.GetBytes(cl));
            // 通过使用循环，将字节类型的数组转换为字符串，此字符串是常规字符格式化所得
            for (int i = 0; i < s.Length; i++)
            {
                // 将得到的字符串使用十六进制类型格式。格式后的字符是小写的字母，如果使用大写（X）则格式后的字符是大写字符 
                pwd = pwd + s[i].ToString("X");
            }
            return pwd;
        }
        /// <summary>
        /// md5加密，补足32位大写
        /// </summary>
        /// <param name="str"></param>
        /// <returns></returns>
        public static string MD5Encrypt32(string str)
        {
            if (string.IsNullOrEmpty(str))
            {
                return "";
            }
            string cl = str;
            string pwd = "";
            MD5 md5 = MD5.Create();//实例化一个md5对像
            // 加密后是一个字节类型的数组，这里要注意编码UTF8/Unicode等的选择　
            byte[] s = md5.ComputeHash(Encoding.UTF8.GetBytes(cl));
            // 通过使用循环，将字节类型的数组转换为字符串，此字符串是常规字符格式化所得
            for (int i = 0; i < s.Length; i++)
            {
                // 将得到的字符串使用十六进制类型格式。格式后的字符是小写的字母，如果使用大写（X）则格式后的字符是大写字符 
                pwd = pwd + s[i].ToString("X").PadLeft(2, '0');
            }
            return pwd;
        }
        /// <summary>
        /// md5加密，补足32位 小写
        /// </summary>
        /// <param name="str"></param>
        /// <returns></returns>
        public static string MD5Encrypt32_Lowercase(string str)
        {
            if (string.IsNullOrEmpty(str))
            {
                return "";
            }
            string cl = str;
            string pwd = "";
            MD5 md5 = MD5.Create();//实例化一个md5对像
            // 加密后是一个字节类型的数组，这里要注意编码UTF8/Unicode等的选择　
            byte[] s = md5.ComputeHash(Encoding.UTF8.GetBytes(cl));
            // 通过使用循环，将字节类型的数组转换为字符串，此字符串是常规字符格式化所得
            for (int i = 0; i < s.Length; i++)
            {
                // 将得到的字符串使用十六进制类型格式。格式后的字符是小写的字母，如果使用大写（X）则格式后的字符是大写字符 
                pwd = pwd + s[i].ToString("x").PadLeft(2, '0');
            }
            return pwd;
        }

        #endregion

        #region Base64
        /// <summary>
        /// base64编码
        /// </summary>
        /// <param name="str"></param>
        /// <returns></returns>
        public static string Base64(string str)
        {
            byte[] bytes = Encoding.UTF8.GetBytes(str);
            return Convert.ToBase64String(bytes);
        }
        #endregion

        #region SHA1
        public static string SHA1(string enstr)
        {
            var strRes = Encoding.Default.GetBytes(enstr);
            HashAlgorithm iSha = new SHA1CryptoServiceProvider();
            strRes = iSha.ComputeHash(strRes);
            var enText = new StringBuilder();
            foreach (byte iByte in strRes)
            {
                enText.AppendFormat("{0:x2}", iByte);
            }
            return enText.ToString();
        }
        #endregion

        #region HmacSHA256
        public static string HmacSHA256(string key, string rawstr)
        {
            var encoding = new System.Text.UTF8Encoding();
            var rawbytes = encoding.GetBytes(rawstr);
            var keybytes = encoding.GetBytes(key);

            // Initialize the keyed hash object.
            using (HMACSHA256 hmac = new HMACSHA256(keybytes))
            {
                byte[] hashValue = hmac.ComputeHash(rawbytes);
                var enText = new StringBuilder();
                foreach (byte iByte in hashValue)
                {
                    enText.AppendFormat("{0:x2}", iByte);
                }
                return enText.ToString();
            }
        }
        #endregion

        #region HmacSHA256AndBase64
        public static string HmacSHA256ThenBase64(string key, string rawstr)
        {
            var encoding = new System.Text.UTF8Encoding();
            var rawbytes = encoding.GetBytes(rawstr);
            var keybytes = encoding.GetBytes(key);

            // Initialize the keyed hash object.
            using (HMACSHA256 hmac = new HMACSHA256(keybytes))
            {
                byte[] hashValue = hmac.ComputeHash(rawbytes);
                return Convert.ToBase64String(hashValue);
            }
        }
        #endregion

    }
}
